package com.agritech.adapter;

import com.agritech.machine.AgriculturalMachine;
import com.agritech.environment.EnvironmentData;
import com.agritech.observer.EnvironmentObserver;

/**
 * 无人机适配器类
 * 适配器模式：将一个类的接口转换成客户希望的另外一个接口。
 * Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
 * 此处将ThirdPartyDrone适配为AgriculturalMachine
 */
public class DroneAdapter extends AgriculturalMachine implements EnvironmentObserver {

    @Override
    public String getObserverName() {
        return "无人机适配器 (" + getId() + ")";
    }
    private ThirdPartyDrone drone; // 被适配的对象
    private String droneModel;

    public DroneAdapter(ThirdPartyDrone drone, String id, String model) {
        super(id, "无人机(" + model + ")");
        this.drone = drone;
        this.droneModel = model;
        System.out.println("无人机适配器已创建，适配无人机型号: " + model);
    }

    @Override
    public void start() {
        System.out.println("通过适配器启动无人机 " + droneModel + "...");
        drone.powerOn();
        // 适配器可能需要执行额外的启动逻辑，例如自检
        if (drone instanceof AdvancedDrone) { // 假设可以检查类型
             // drone.takeOff(10); // 默认起飞高度，或者根据任务需求
             System.out.println("无人机 " + droneModel + " 引擎已启动，待命起飞");
        }
        setRunning(true);
    }

    @Override
    public void stop() {
        System.out.println("通过适配器停止无人机 " + droneModel + "...");
        if (drone instanceof AdvancedDrone) { // 假设可以检查类型
            AdvancedDrone ad = (AdvancedDrone) drone;
            if (ad.isFlying()) { // 检查是否在飞行，如果是则先降落
                System.out.println("无人机正在飞行，先执行降落操作...");
                ad.land();
            }
        }
        drone.powerOff();
        setRunning(false);
    }

    @Override
    public void performTask(String taskDetails) {
        if (!isRunning()) {
            System.out.println("无人机 " + droneModel + " 未启动，无法执行任务: " + taskDetails);
            return;
        }
        System.out.println("通过适配器让无人机 " + droneModel + " 执行任务: " + taskDetails);
        // 适配任务描述到无人机可理解的格式
        // 例如，taskDetails可能是 "喷洒农药区域A"，需要转换为无人机的具体飞行指令
        if (drone instanceof AdvancedDrone) {
            AdvancedDrone ad = (AdvancedDrone) drone;
            if (!ad.isFlying()) {
                System.out.println("无人机未起飞，自动起飞至10米高度执行任务...");
                ad.takeOff(10.0); 
            }
        }
        drone.flyMission("适配任务: " + taskDetails);
        consumeFuel(2.0); // 无人机执行任务消耗电力（等效燃油）
    }

    @Override
    public void update(EnvironmentData data) {
        System.out.println("无人机适配器 " + getId() + " 收到环境数据更新:");
        // 无人机可以根据环境数据调整飞行策略
        if (data.getWindSpeed() > 10.0) {
            System.out.println("  检测到强风 (" + data.getWindSpeed() + "m/s)，无人机 " + droneModel + " 暂停任务并尝试保持稳定");
            // drone.holdPosition(); // 假设有保持位置的方法
            if (isRunning() && drone instanceof AdvancedDrone && ((AdvancedDrone) drone).isFlying()) {
                System.out.println("  无人机 " + droneModel + " 正在执行降落程序以保证安全。");
                drone.land();
            }
        } else if (data.getTemperature() < 0) {
            System.out.println("  检测到低温 (" + data.getTemperature() + "°C)，无人机 " + droneModel + " 电池性能可能下降，请注意飞行时间");
        }
    }
    
    /**
     * 获取无人机状态 (通过适配器调用)
     * @return 无人机状态字符串
     */
    public String getDroneStatusViaAdapter() {
        return drone.getDroneStatus();
    }

    // Adapter spécifiques méthodes si nécessaire
    public void droneSpecificOperation() {
        System.out.println("执行无人机 " + droneModel + " 特有的操作 (通过适配器)");
        // drone.someSpecificAdvancedDroneMethod(); // Si applicable
    }
}